package selectlearn

import (
	"fmt"
	"time"
)

func SelectLearn() {
	//go语言提供了一个select功能，作用域channel之上。
	//不同于socket编程中的多路复用select,但效果差不多
	//ch1 := make(chan int, 1)
	//ch2 := make(chan int, 1)
	//ch1 <- 1
	//ch2 <- 2
	//
	////从多个channel中任意选择一个执行
	////select 会随机公平的选择一个case语句执行
	//select {
	//case data := <-ch1:
	//	fmt.Println(data)
	//case data := <-ch2:
	//	fmt.Println(data)
	//default:
	//	fmt.Println("进入default分支")
	//}

	//select的应用场景
	//1.timeout的超时机制
	//2.判断某个channel是否被阻塞住

	//timeout := false
	timeout := make(chan bool, 1)
	go func() {
		//该goroutine如果执行时间超过了一秒，那么久报告给goroutime
		time.Sleep(time.Second * 1)
		//timeout =true
		timeout <- true
	}()

	timeout2 := make(chan bool, 1)
	go func() {
		time.Sleep(time.Second * 5)
		timeout2 <- true
	}()

	//for {
	//	if timeout {
	//		fmt.Println("结束")
	//		break
	//	}
	//	time.Sleep(time.Millisecond * 10)
	//}

	//fmt.Println(<-timeout) //channel取值的时候是阻塞的

	select {
	case <-timeout:
		fmt.Println("超时了")
	case <-timeout2:
		fmt.Println("超时了")
	default:
		fmt.Println("继续下一次")
	}
}
